﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CdgNetPersistencia.ClasesBases;
using CdgNetPersistencia.Atributos;
using System.Reflection;

namespace CdgNetPersistencia.ComponentesSQL
{
    
    public class SelectSQL
    {

    #region PROPIEDADES

        public static string DROP_SQL = "DROP TABLE IF EXISTS '{0}'";
        public static string CREATE_SQL = "";

        public const string SELECT_BASICO = "SELECT {0} {1} FROM {2} ";

        private const string __FILTRO_BASICO_INT = " WHERE {0}.{1} = {2}";
        private const string __FILTRO_BASICO_STRING = " WHERE {0}.{1} LIKE \'%{2}%\'";

        private const string __INSERT_SQL = "INSERT INTO {0} ({1}) VALUES ({2})";
        private const string __UPDATE_SQL = "UPDATE {0} SET {1} ";
        private const string __DELETE_SQL = "DELETE FROM {0} ";


        protected string _cSelect { get; set; }


    #endregion


        #region GETTERS Y SETTERS



        public static SelectSQL GetSelect(Type OTD)
        {
            //resultado del metodo
            SelectSQL oSelect = new SelectSQL();

            string cCampos = string.Empty;

            try
            {
                //tomamos el tipo de la instancia
                Type tTipoOtTD = typeof(OTDbase);

                //tomamos los metodos de la clase
                MethodInfo[] aMetodos = tTipoOtTD.GetMethods();

                //recorremos los metodos de la clase actual
                foreach(MethodInfo metodo in aMetodos)
                {
                    //http://msdn.microsoft.com/es-es/library/z919e8tw%28v=vs.80%29.aspx
                    //tomamos los atributos del tipo Campo que la clase contiene
                    object[] atributos = metodo.GetCustomAttributes(true);

                    //recorremos sus atributos
                    foreach(object atributo in atributos) 
                    {
                        //si el atributo actual es del tipo campo
                        if(atributo is CdgNetPersistencia.Atributos.Campo)
                            //agregamos el nombre del campo a la cadena
                            cCampos += ((CdgNetPersistencia.Atributos.Campo)atributo).GetNombre + ", ";
                    }

                    //removemos el espacio final
                    cCampos = cCampos.Remove(cCampos.Length - 2);

                    //formamos la sentencia de seleccion
                    oSelect._cSelect = string.Format(SELECT_BASICO
                                                , string.Empty      //{0}
                                                , cCampos           //{1}
                                                , "TABLA"           //{2}
                                            );
                }

            }
            catch (Exception ex)
            {
                
                throw;
            }


            //devolvemos el resultado del metodo
            return oSelect;

        }



        #endregion

    }

}
